/*几张卡牌 排成一行，每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
每次行动，你可以从行的开头或者末尾拿一张卡牌，最终你必须正好拿 k 张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数数组 cardPoints 和整数 k，请你返回可以获得的最大点数。
*/

/*
输入：cardPoints = [1,2,3,4,5,6,1], k = 3
输出：12
解释：第一次行动，不管拿哪张牌，你的点数总是 1 。但是，先拿最右边的卡牌将会最大化你的可获得点数。最优策略是拿右边的三张牌，最终点数为 1 + 6 + 5 = 12 。
*/

//思路，要求可获得的最大点数，那么最后剩下的一串数据一定连续且和为最小，利用滑动窗口求出连续和最小的length-k长度的数字串，再用总和减去这一串即可

class Solution {
	public int maxScore(int[] cardPoints,int k){
		int len=cardPoints.length;
		//确定滑动窗口的大小
		int WindowSize=len-k;
		int sum=0;
		for(int i=0;i<WindowSize;i++){
			sum+=cardPoints[i];
			}
		int minSum=sum;
		for(int i=WindowSize;i<len;i++){
			sum+=cardPoints[i]-cardPoints[i-WindowSize);
			minSum=Math.min(sum,minSum);
		}
		int count=0;
		for(int i=0;i<len;i++){
			count+=cardPoints[i];
		}
	return count-minSum;
	}
}